package com.kyl.service.impl;

import cn.hutool.core.date.LocalDateTimeUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.kyl.base.PageResponse;
import com.kyl.dto.PostDto;
import com.kyl.entity.Post;
import com.kyl.mapper.PostMapper;
import com.kyl.service.DeptService;
import com.kyl.service.PostService;
import com.kyl.utils.EmptyUtil;
import com.kyl.vo.DeptVo;
import com.kyl.vo.PostVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 岗位表服务实现类
 */
@Service
public class PostServiceImpl implements PostService {
    @Resource
    private PostMapper postMapper;

    @Resource
    private DeptService deptService;
    /**
     * 多条件查询职位分页列表
     *
     * @param postDto  查询条件
     * @param pageNum  当前页码值
     * @param pageSize 每页显示条数
     * @return
     */
    @Override
    public PageResponse<PostVo> findPostPage(PostDto postDto, int pageNum, int pageSize) {
        //1、启动分页助手，进行分页设置
        PageHelper.startPage(pageNum, pageSize,"sort_no asc, create_time desc");

        //2、检查部门编号是否为空
        if (EmptyUtil.isNullOrEmpty(postDto.getDeptNo())) throw new RuntimeException("部门不能为空");

        //3、执行查询
        Page<List<Post>> page= postMapper.selectPage(postDto);

        //把查询结果转换为分页对象
        PageResponse<PostVo> pageResponse = PageResponse.of(page, PostVo.class);

        //4、对查询结果进行判空,不为空就做进一步操作
        if (!EmptyUtil.isNullOrEmpty(pageResponse.getRecords())){
            //提取所有部门编号,通过lambda表达式，.map(PostVo::getDeptNo)提取部门编号，重新组合成一个列表
            List<String> deptNoList = pageResponse.getRecords().stream().map(PostVo::getDeptNo).collect(Collectors.toList());
            //根据部门编号查询部门信息
            List<DeptVo> deptVoList = deptService.findDeptInDeptNos(deptNoList);
            //遍历查询结果，设置创建日期和关联部门信息
            pageResponse.getRecords().forEach(postVo -> {
                //设置创建日期
                postVo.setCreateDay(LocalDateTimeUtil.format(postVo.getCreateTime(), "yyyy-MM-dd"));
                //设置关联部门信息
                deptVoList.forEach(d -> {
                    if (postVo.getDeptNo().equals(d.getDeptNo())) {
                        postVo.setDeptVo(d);
                    }
                });
            });
        }

        //返回结果
        return pageResponse;
    }
}
